題目:
(6 級) Sort the odd
你有一組數字陣列。
你的任務是對奇數由小到大進行排序,但偶數必須在其原本的位置。
零不是奇數,不需要移動它。如果你有一個空陣列,則回傳該空陣列。
範例:
sort_array([5, 3, 2, 8, 1, 4])
=> [1, 3, 2, 8, 5, 4]
sort_array([5, 3, 2, 8, 1, 4])
=> [1, 3, 2, 8, 5, 4]
Ruby 解法:
def sort_array(source_array)
# 先把陣列中的奇數挑出來
# 並由小到大排序
odds = source_array.select(&:odd?).sort
# 開始對原本陣列的數字一個個進行比對
source_array.map.with_index { |num, index|
# 如果原本陣列的數字是奇數
if num.odd?
# 拿目前奇數陣列的第一個數字 (最小的) 替換掉
source_array[index] = odds.shift
else
# 若為偶數則保留原本的數字
num
end
}
end
JavaScript 解法:
function sortArray(array) {
// 先把陣列中的奇數挑出來
// 並由小到大排序
let odds = array.filter(n => n % 2 !== 0)
.sort((a, b) => a > b ? 1 : -1);
// 開始對原本陣列的數字一個個進行比對
return array.map ((num, index) => {
// 如果原本陣列的數字是奇數
if (num % 2 !== 0) {
// 拿目前奇數陣列的第一個數字 (最小的) 替換掉
return array[index] = odds.shift();
} else {
// 若為偶數則保留原本的數字
return num;
}
});
}
心得:
看解答時發現可以使用 Enumerator 來進行迭代會更方便
def sort_array(xs)
odd = xs.select(&:odd?).sort.each
xs.map{ |x| x.odd? ? odd.next : x }
end
[1, 3, 5, 7, 9].each
=> #<Enumerator: [1, 3, 5, 7, 9]:each>
a = #<Enumerator: [1, 3, 5, 7, 9]:each>
a.next => 1
a.next => 3
a.next => 5
a.next => 7
a.next => 9
a.next
Traceback (most recent call last):
5: from /Users/parker/.rvm/rubies/ruby-2.6.5/bin/irb:23:in `<main>'
4: from /Users/parker/.rvm/rubies/ruby-2.6.5/bin/irb:23:in `load'
3: from /Users/parker/.rvm/rubies/ruby-2.6.5/lib/ruby/gems/2.6.0/gems/irb-1.0.0/exe/irb:11:in `<top (required)>'
2: from (irb):23
1: from (irb):23:in `next'
StopIteration (iteration reached an end)